package com.simpou.commons.utils.compiler;

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;

import java.net.URI;

import javax.tools.SimpleJavaFileObject;


/**
 * Representa um arquivo java, fonte ou compilado.
 *
 * @author Jonas Pereira
 * @since 2011-08-18
 * @version 2012-07-13
 */
final class CompilerJavaFileObject extends SimpleJavaFileObject {
    /**
     * Código fonte.
     */
    private String source;

    /**
     * Código compilado.
     */
    private ByteArrayOutputStream byteCode = new ByteArrayOutputStream();

    /**
     * <p>Constructor for CompilerJavaFileObject.</p>
     *
     * @param className Nome da classe.
     * @param source Código fonte.
     */
    CompilerJavaFileObject(final String className, final String source) {
        super(createURI(getSrcFileName(className)), Kind.SOURCE);
        this.source = source;
    }

    /**
     * <p>Constructor for CompilerJavaFileObject.</p>
     *
     * @param className Nome da classe.
     */
    CompilerJavaFileObject(final String className) {
        super(createURI(className), Kind.SOURCE);
    }

    /**
     * @param className Nome da classe.
     * @return Nome do arquivo fonte com extensão que originou a classe.
     */
    private static String getSrcFileName(final String className) {
        return className + Kind.SOURCE.extension;
    }

    /**
     * Método para criar URIs sem gerar checked exceptions.
     *
     * @param className Nome da classe.
     * @return URI correspondente à classe.
     */
    private static URI createURI(final String className) {
        try {
            return new URI(className);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    /**
     * <p>getBytes.</p>
     *
     * @return Bytecodes.
     */
    byte[] getBytes() {
        return byteCode.toByteArray();
    }

    /** {@inheritDoc} */
    @Override
    public String getCharContent(final boolean ignoreEncodingErrors) {
        return source;
    }

    /** {@inheritDoc} */
    @Override
    public OutputStream openOutputStream() {
        return byteCode;
    }
}
